/**
  ******************************************************************************
  * @file    iic.h
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-01-16
  * @brief   iic驱动,适用于PIC16(L)F1788_9
  *
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

#ifndef __IIC_H
#define __IIC_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common.h"

/* 宏定义---------------------------------------------------------------------*/
/* iic_mode iic主从模式选择 */
#define IIC_MODE_MASTER                         (0x8) /* 主模式,时钟=Fosc/(4*(SSPADD+1)) */
#define IIC_MODE_SLAVE_7                        (0x6) /* 从模式,7位地址 */
#define IIC_MODE_SLAVE_10                       (0x7) /* 从模式,10位地址 */
#define IIC_MODE_SLAVE_7_IT                     (0xE) /* 从模式,7位地址,允许启动和停止位中断 */
#define IIC_MODE_SLAVE_10_IT                    (0xF) /* 从模式,10位地址,允许启动和停止位中断 */
    
/* 类型定义-------------------------------------------------------------------*/
typedef struct iic_config {
    uint8_t mode : 4; /* @ref iic_mode */
    uint8_t freqDiv; /* 时钟分频 4~255 */
} iic_config_t;
    
/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
void iic_init(iic_config_t _config);
void iic_de_init(void);

inline void iic_start(void);
inline void iic_restart(void);
inline void iic_write(uint8_t byte);
inline uint8_t iic_read(uint8_t ack);
inline void iic_stop(void);

void iic_write_bytes(uint8_t addr, uint8_t *bytes, uint8_t len);
void iic_read_bytes(uint8_t addr, uint8_t *bytes, uint8_t len);

#ifdef __cplusplus
}
#endif

#endif /* iic.h */